
=-=-=-=-=-==-=-=-=-=-===-=-=-=-=-=

Cel: 	CrackmeHostile by Bswap 1.1
Autor:	M@rio // MBECrew
Data: 	18.o8. anno domini 2oo3

=-=-==-=-=-=-=-=-=-=-===-=-=-=-=-=


Na wstepie chcialem tylko ostrzec! ze jest to moj pierwszy tut wiec pewne sprawy moga zostac ominiete a inne wyjasnione dosc lopatologicznie, wiec jesli komus sie nie podoba to niech wie, ze bardzo nad tym ubolewam :>

Ale przejdzmy do sedna sprawy, naszym celem jest CrackmeHostile by Bswap autorstwa niejakiego Hero B. w info czytamy, ze trzeba zrobic wszystko zeby crackme po nacisnieciu buttona dal nam do zrozumienia, ze jest zarejestrowane. Autor podkresla takze iz wystarczy zmienic tylko 2 bajty do osiagniecia celu! No wiec ja sobie postanowilem ze zrobie i cracka i loadera (aha progs jest spakowany FSG! - dzieki temu bedzie weselej :) No to do roboty...



				Part I - "The meaning of life" 

Uruchamiamy naszego proga i widzimy ladne okienko z buttonem "Check" i powyzej "i'm sorry but you are not registered" naciskamy Check i napis zmienia sie na "you are still not registered" :(. Jak wiemy crackme jest spakowane FSG wiec najlepiej bedzie najpierw odpakowac go za pomoca ProcDump. Nie bede tego opisywal bo jest to niepotrzebne a jesli nie wiecie jak puknac FSG to poczytajcie o tym w texcie Ged_'a na www.cracking.pl
Mamy naszego odpakowanego proga, ale na razie go zostawiamy gdzies na uboczu. Od razu powiem ze proby otwarcia go w Wdasm'ie skoncza sie na malym guziczu z napisem RESET :). Jak wiemy w (prawie?) kazdym programie (32bit) jest pobierany uchwyt (Handle) za pomoca GetModuleHandleA a wiec zakladamy sobie na niego pulapke 

:bpx getmodulehandlea 

i odpalamy teraz jestesmy jeszcze w Explorer wiec jeszcze raz Ctrl+D ...F11 i juz jestesmy na poczatku crackme, nas interesuje co sie stanie po wcisnieciu buttona (pokaze wam opis schematyczny, powinniscie sie polapac :P )

	Original Entry Point

call	GetModuleHandleA
...	...
...	...
...	...
call	DialogBoxParamA (pod 00401030 jest obsluga dialogbox'a)
...	...
...	... (w [ebp+0Ch] lezy uchwyt buttona)
	    (i jest on porownywany w roznych miejscach, wiec idziemy jego sladem)

cmp	[ebp+0c], cos_tam1
jnz	00401083--------.
			|
(wyswietlanie ikonki)	|
		      <-'
cmp	[ebp+0c], cos_tam2
jnz	004010EC--------.
			|
(tworzenie obrazka)	|
		      <-'
cmp	[ebp+0c], cos_tam3
jnz	00401153--------.
			|
(malowanie obrazka)	|
		      <-'
cmp	[ebp+0c], cos_tam4
jnz	0040116E

	
ostatni skok prowadzi nas do swoistego rodzaju checksumy :o domowej roboty ;)

mov	ecx, D9h
mov	bl, [ecx+00403028]  <-- jakis ciekawy :) ciag danych
...	...
(jakies operacje)
...	...
loop	cos_tam		<-- petla (217 znakow)
cmp	eax, a2046a1c
jz	004011C9	<-- jezeli rowne to w porzadku
...	...
call	DestroyWindow	<--a jezeli nie rowne to usun buttona

wniosek jest prosty jezeli chociaz jeden z 217 znakow zaczynajacych sie od adresu 00403028 zostanie zmieniony (spatchowany) to po nacisnieciu "Check" przycisk nam zniknie! Jezeli nic nie zmienimy to dojdziemy do tego miejsca:

push	E00
push	0
call	GlobalAlloc	
mov	[004030d4], eax
cmp	eax, 0
jnz	004011f7------.  <- jesli OK to jedziemy dalej, a jak nie to pokaz okienko o bledzie
		      |
call	GetTickCount <'  <- utworz liczbe pseudolosowa (a doslownie ilosc milisekund od uruchomienia windowsa)

mov	ebx, eax
push	[004030d4]	nasz "losowy adres"
pop	eax		laduje do eax
inc	ebx		
xor	edx, edx	
xor	ecx, ecx
add	al, bl
mov	dl, byte ptr [ecx+00403028] <-.
mov	byte ptr [ecx+eax], dl	      |
inc	ecx			      |
cmp	ecx, DDh (221 dec)	      |
jae	00401220		      |
jmp	0040120C	--------------'


Juz tlumacze, tutaj nastepuje utworzenie losowo wygenerowanej liczby, ktora staje sie virtualnym adresem, do ktorego jest kopiowanych 221 znakow z adresu 00403028 (coz...przynajmniej udawaj ze rozumiesz :)

Jesli juz wszystkie znaki zostana skopiowane to idziemy dalej

mov	dword ptr [eax+85], 003857D5h
mov	dword ptr [eax+88], 008F5FD5h
mov	dword ptr [eax+8B], F801F801h
mov	word ptr [eax+8F], F801h

xor	edx, edx
xor	ecx, ecx

do naszego virtual adresu (od miejsca "eax+85") zostaja wpisane jakies inne bajty... i teraz czesc najwazniejsza!



				PART II - "The third world" 



mov	dl, byte ptr [ecx+eax]
push	edx			(1)
shr	edx, 03
xor	edx, 1F
push	ecx			(a)
rcr	dx, 03
xchg	dl, dh
add	cl, dl
pop	ecx			(b)
sub	dl, cl
xor	edx, 10101010
sub	edx, 16
pop	edx			(2)
sub	edx, 16
xor	edx, 32
mov	byte ptr [ecx+eax], dl
inc	ecx
cmp	ecx, 0DFFh
jae	0040127F
jmp	0040124B


No to mamy troszke licznia co nie?!... Oczywiscie ze NIE! :-\ do dl jest wstawiany kolejny znak z naszego virtual adresu i teraz (1) ten znak jest wrzucany na stos i wraca z powrotem w miejscu (2) i jeszcze ecx jest wrzucane na stos (a) i sciagane (b) a dalej nie ma na tym rejestrze zadnych operacji wiec od pkt 1 do 2 teoretycznie nic sie nie zmienia (autor, jak widzimy chcial, zebysmy przy tym troszke pomysleli) a wiec upraszczajac nasze algo mamy

mov	dl, byte ptr [ecx+eax] <--.
sub	edx, 16			  |
xor	edx, 32			  |
mov	byte ptr [ecx+eax], dl	  |
inc	ecx			  |
cmp	ecx, 0DFFh		  |
jae	0040127F		  |
jmp	0040124B -----------------'


Od razu podpowiem ze nie trzeba czekac az ta petla sie zakonczy bo raczej nikt nie ma tyle cierpliwosci :) ale jest jeden sposob w linii komend wpisujemy 

:d eax 

w sekcji danych ukaze nam sie nasz ciag bajtow, ktory wlasnie w tej petli zostaje zmielony. Ja zrobilem tak - trzymalem F10 az do momentu kiedy zobaczylem takie stringi...uupss :) tzn. taki string "Well done you are registered!" i trzymalem jeszcze az ecx osiagnal wartosc DDh czyli tyle ile zostalo skopiowanych znakow do naszego virtual'a. Po tym gdy doszedlem do skoku jae zmienilem flage "r fl c" i skok do:

pushad
mov	ebx, eax	do ebx kopiowane jest eax
call	eax		w eax mamy virtual adres wiec w tym miejscu F8
popad
mov	dword ptr [eax+43], 20202020h	
add	eax, 40h			eax przesuwany o 40h
push	eax
push	0
push	0C
push	dword ptr [00403004]
call	SendMessageA		
...	...		<-- dalej jest wyswietlany string zaczynajacy sie pod adresem eax

A wiec w naszym call'u widzimy:

nop
xor	eax, eax
or	eax, eax
jz	skok	   (1)   ten skok wykona sie zawsze (patrz operacje wyzej) eax zawsze = 0
jmp	skok_1
...	...
...	...
skok_1:
jmp	skok_2
...	...
...	...
skok_2:
ret
...	...
...	...
skok:
lea	esi, [ebx+10h]	do esi leci string z NOT_REGISTERED
lea	edi, [ebx+4Bh]  do edi leci string z REGISTERED
fnop
fnop
fnop
mov	ecx, 28h
cld
petla:
movsb
loop	petla		po tych operacjach string z esi jest kopiowany do edi
ret			i string w edi jest wyswietlany w oknie czyli po tych operacjach 			zawsze bedziemy NOT_REGISTERED :(

Wniosek: (a raczej kilka wnioskow =)

1. aby prog byl zawsze zarejestrowany wystarczy zmienic skok (1) **jz skok** na **jnz skok** czyli bajt 74 na 75 i dodatkowo skok z checksum'y z 74 na 75, to dlatego ze zmieniamy kawalek kodu ktory jest wlasnie przez ta checksume sprawdzany, wiec jak zmienimy w checksumie skok na przeciwny to nas nie wywali (logiczne, prawda :))

2. mozna tez zrobic to latwiejsza metoda, pamietacie kawalek kodu:

	operacje			opcody

jae	0040127F			(73 02)  	02 - tzn. skok o 2 miejsca dalej
jmp	0040124B   			(EB CC)
0040127F:
pushad		 			(60)	\
mov	ebx, eax			(8B D8)	 \_ te operacje musimy opuscic!
call	eax				(FF D0)	 /
popad					(61)	/
mov	dword ptr [eax+43], 20202020h	<--- tutaj musimy skoczyc aby ominac NOT_REGISTERED
add	eax, 40h				

juz wiesz...oczywiscie wystarczy zmienic bajt *02* na *08*, dlaczego, bo zamiast skoku o 2 miejsca dalej skoczymy o 8 dalej i dzieki temu nie zmienimy naszego string'u z REGISTERED a co za tym idzie nie bedziemy musieli zmieniac skoku z checksum'y poniewaz patchujemy bajt ktory nie jest przez checksume sprawdzany :D a ten kawalek

add	eax, 40h	

w offscie wskazanym przez eax bedziemy mieli wtedy nasz string z REGISTERED.

3. zeby bylo ciekawiej (i zebyscie sie mogli czegos nauczyc :) to cracka zrobimy na wzor pkt. 1 a loadera na wzor pkt. 2) dlaczego nie na odwrot za niedlugo sie przekonacie...



				PART III - "The Miracle of Birth"



To jest moim zdaniem czesc najtrudniejsza, jak zrobic cracka do proga spakowanego FSG otoz przy odrobinie szczescia :P jest to mozliwe (nie mowie tutaj o zadnych inline patcherach)
Pierwsze co musimy sprawdzic to w ktorych miejscach jest prog depakowany, wiec ladujemy orygianlnego crackmeHostile.exe (~20Kb) do procdump'a i patrzymy na entrypoint - 00013C5B
od tego momentu nastepuje odpakowanie programu, dla nas najwazniejsze jest odpakowanie naszych bajtow czyli pod 004011A7 (checksum) bajtu 74 i pod hhhmmm...wlasnie dzieki virtual-pseudo-losowemu :) adresowi nie mozemy wprost spatchowac bajtu ale mozemy spatchowac bajty pod adresem 00403028 a przeciez to jest nasze podstawowe zrodlo danych (tylko troszke zmielone:

sub	edx, 16
xor	edx, 32

to oznacza ze musimy przepuscic nasz bajt *74* przez odwrotnosc tych operacji czyli...

74 xor 32 + 16 = 5C

czyli musimy znalezc (w naszym odpakowanym juz crackme) bajt 5C gdzies na poczatku adresu 00403028 widzimy tam dwa takie bajty niedaleko siebie wiec ktory jest ktory? widzimy ze

   operacje		opcody

nop			(90)	90 xor 32 + 16 = B8
xor	eax, eax
or	eax, eax
jz	skok		(74 ..) 74 xor 32 + 16 = 5C
jmp	skok_1		(EB ..) EB xor 32 + 16 = EF
...	...

czyli pomiedzy naszym 5C musza byc po lewej B8 i po prawej EF.... tak teraz juz jestesmy pewni drugi adres do spatchowania to 0040302D

teraz chcemy to miejsce zmienic na 75 tyle ze te 75 tez musimy odwrocic 
75 xor 32 + 16 = 5D	

W ten sposob wiemy ze przy depakowaniu musimy zwrocic uwage na adresy:

0040302D (gdzie bajt 5C zmieniamy na 5D) 
004011A7 (gdzie bajt 74 zmieniamy na 75)

Ale jak zlapac naszego depakera na tych adresach?...wchodzimy do Symbol Loader'a i otwieramy nasze oryginalne crackme i dajemy Load...Tak i jestesmy w EntryPoint FSG teraz ustawiamy pulapke na pierszym adresie czyli 

:bpm 0040302D 

i Ctrl+D zajrzyj teraz do EDI i co ...pusto :) no to daj  

:d EDI-1 

i co...znajoma liczba :D a teraz zajrzyj do ESI-1 i taaddaa =), zapisujemy sobie gdzies na kartce adres ESI-1 w naszym wypadku jest to 0040FC47

teraz kasujemy nasza pulapke

:bc 0

i ustawiamy nowa na nasz drugi adres - 004011A7

:bpm	004011A7	i Ctrl+D

i znowu patrzymy na EDI-1 i co...czyzby 74...NIE! no to lepiej przeczytaj wszystko spokojnie od poczatku :P bo to MUSI byc 74 :) teraz sprawdzamy ESI-1 i widzimy 74 pod adresem 0040FB17

wszystko sie zgadza i chyba rozumiesz co jest grane ... z ESI czyli adresu zrodlowego kopiowane sa po kolei bajty do EDI czyli adresu docelowego, ale ja mialem to szczescie ze spakowane bajty mialy ta sama wartosc poniewaz w niektorych wypadkach bajty sa najpierw kopiowane z poprzedniego adresu i wstawiany w tej samej postaci, dlatego wlasnie drugi sposob czyli spatchowanie 1 bajtu a dokladniej *02* na *08* skonczylo by sie na tym ze musielibysmy spatchowac takie same bajty w innych miejscach! (mam nadzieje ze wszystko rozumiesz do tej pory, jesli nie za bardzo, to sam sprawdz [chyba wiesz jak?! :)] )

no wiec mamy nasze ukochane :) adresy spakowanego pliku:

0040FC47 - tutaj znajduje sie bajt 5C ktory trzeba zmienic na 5D
0040FB17 - bajt 74 na 75 

Wrocimy do nich troche pozniej, jak juz bedziemy kodowac cracka


Teraz czas na pkt 2 czyli "robimy loadera" tutaj akurat mamy mniej roboty, otoz wystarczy ze 
mamy nasz adres - 0040127C w ktorym 02 zmieniamy na 08 (nie wiem czy to zgodne z prawem, autor mowi ze wystarczy zmienic TYLKO 2 bajty :P )



				PART IV - "Cholera,...mialy byc tylko 3 czesci :/"
   	

Przystepujemy do robienia cracka, w gruncie rzeczy jest to prosta sprawa, otoz najpierw musimy spisac sobie offsety adresow ktore bedziemy patchowac czyli ladujemy naszego odpakowanego proga do Hiew i szukamy adresow najezdzamy na pierwszy adres i wciskamy kombinacje klawiszy Alt+F1 i mamy adresy fizyczne:

0040FC47	- offset E47h
0040FB17	- offset D17h


;:::::::::::::::::::::::::::::::::SZABLON CRACK'A (zywcem zerzniete from smola's "generic crack" :P :::::::::::::::::::::::::

  .486
    .model flat, stdcall
    option casemap :none    
;****************************************************************************
    include c:\masm32\include\windows.inc
    include c:\masm32\include\user32.inc
    include c:\masm32\include\kernel32.inc	;includy i biblioteki ktorych
    includelib c:\masm32\lib\user32.lib		;bedziemy potrzebowac
    includelib c:\masm32\lib\kernel32.lib
;************************SEKCJA DANYCH***********************************
    .data
                   
szMsgTitle      	db 'Crack for [CrackmeHostile by Bswap]',0	;tytul na pasku
szFileName      	db 'CrackmeHostile.exe',0      		;nazwa pliku do spatchowania
lFileSize       	dd 20320               	;dlugosc pliku 
lFileOffset     	dd 0D17h                ;nasz 1 offset do spatchowania
lFileOffset1    	dd 0E47h                ;2 offset
lChanges        	dd 1                    ;ilosc bajtow do spatchowania
BytesToWrite    	db 75h		        ;\__nowe bajty
BytesToWrite1   	db 5Dh		        ;/
dupaaaa			db '! Info !',0 	;tytul okienka powitalnego :P
about			db 'Thanx goes to:',13,10,13,10
			db 'Agent :: Hero B :: Igi',13,10
			db 'Sawka :: Veneta :: and... :)',13,10,13,10		;blabla
			db 'Special thx to :: The DrunkMan ::',13,10,13,10
			db 'M@rio // MBECrew',0


lBytesWriten    	dd 0	;tutaj wyladuje nam ilosc zapisanych bajtow                
hFile           	dd 0    ;uchwyt pliku        

szOK            	db 'Success! File patched.',0		;tu juz nie bede tlumaczyl 
szErrCreate     	db 'Cannot open file.',13,10
                	db 'Check path or filename and try again.',13,10,0
szErrFileSize   	db 'Incorrect size of file.',13,10,0
szErrFilePtr    	db 'Cannot set File Pointer.',13,10,0
szErrWriteFile  	db 'Cannot write to file.',13,10,0
;************************SEKCJA KODU*************************************
    .code

start:

	push 	0
	push 	offset dupaaaa 	;nasze okienko z powitaniem
	push 	offset about 
	push 	0
	call 	MessageBoxA 

;---------------------------------------
; otwarcie pliku do spatchowania

        invoke CreateFileA,offset szFileName,GENERIC_READ + GENERIC_WRITE, \
            0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
        cmp eax,-1                      ;czy plik istnieje?
        mov ebx,offset szErrCreate
        jz error_create                 ;skok jesli nie istnieje

        mov hFile,eax                   ;zapisz uchwyt pliku

;----------------------------------------
; sprawdzanie wersji (dlugosc pliku)

        invoke GetFileSize,eax,NULL
        cmp eax,lFileSize
        mov ebx,offset szErrFileSize
        jnz error                       ;skok jesli rozne wersje

;----------------------------------------
; ustaw pierwszy offset w pliku (0D17h)

        invoke SetFilePointer,hFile,lFileOffset,NULL,FILE_BEGIN
        cmp eax,-1
        mov ebx,offset szErrFilePtr
        jz error                        ;skok jesli nie ustawiony

;----------------------------------------
; zapisz bajty (75h)

        invoke WriteFile,hFile,offset BytesToWrite,lChanges, \
            offset lBytesWriten,NULL
        test eax,eax
        mov ebx,offset szErrWriteFile
        jz error                        ;skok jesli blad w zapisie


;----------------------------------------
;ustaw drugi offset w pliku (0E47h)
        invoke SetFilePointer,hFile,lFileOffset1,NULL,FILE_BEGIN
        cmp eax,-1
        mov ebx,offset szErrFilePtr
        jz error                        ;skok jesli nie ustawiony

;----------------------------------------

; zapisz drugi bajt (5Dh)

        invoke WriteFile,hFile,offset BytesToWrite1,lChanges, \
            offset lBytesWriten,NULL
        test eax,eax
        mov ebx,offset szErrWriteFile
        jz error                        ;skok jesli blad

        mov ebx,offset szOK	

;----------------------------------------


error:
        invoke CloseHandle,hFile        ;zamknij plik

error_create:

        invoke MessageBox,NULL,ebx,offset szMsgTitle,MB_OK+MB_ICONINFORMATION

        invoke ExitProcess,NULL             ;no to spadamy!

End start
;************************KONIEC*******************************************

Oczywiscie mozesz zmieniac wszystko wedlug upodoban :) w granicach rozsadku of coz! 
Teraz wystarczy skompilowac i juz mamy cracka...


Jeszcze zostal nam loader do zrobienia a wiec

;*****oczywiscie zerzniete z sieci (a dokladniej ze stronik FRAVII)********

.386
.model flat,stdcall
option casemap:none
;*************************************************************************
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\comdlg32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\comdlg32.lib
includelib \masm32\lib\user32.lib
;*************************************************************************
.data
LARGE 			dw 0F000h 
CSiR_Tag 		db 'Loader + Patcher',0
CSiR_Error 		db 'Error!!!',0
CSiR_Error1 		db 'Something fucked up...',0
OpenERR_txt 		db 'CreateProcess Error :(',0
ReadERR_txt 		db 'ReadProcessMemory Error :(',0
WriteERR_txt 		db 'WriteProcessMemory Error :P',0
VersionERR_txt 		db 'Incorrect Version of application :(',0 
dupaaaa			db '! Info !',0
about			db 'Thanx goes to:',13,10,13,10
			db 'Agent :: Hero B :: Igi',13,10
			db 'Sawka :: Veneta :: and... :)',13,10,13,10
			db 'Special thx to :: The DrunkMan ::',13,10,13,10
			db 'M@rio // MBECrew',0
CSiR_ProcessInfo 	dd 4 	dup (0) ;uchwyty do procesu
CSiR_StartupInfo 	db 48h 	dup (0) ;startup info
CSiR_RPBuffer 		db 1 	dup (0) ;czytaj buffer

CSiR_AppName 		db 'CrackmeHostile.exe',0 ;wiadomo
fuck 			dd 0040127Ch 		; adres odczytu danych dla sprawdzenia versji

origsize 		dd 1 			; buffer na wielkosc pliku

checkbytes 		db 02h		; oryginalny bajt
						  	; jesli go tam nie ma
							;tzn. ze mamy zla wersje

patch_data_1 		db 08h ; bajty do spatchowania

patch_size_1 		dd 1	;ilosc bajtow do spatch.
patch_addr_1 		dd 0040127Ch	adres do spatch.

 
;*************************************************************************

.code
start:

	push 	0
	push 	offset dupaaaa 	;powitanie
	push 	offset about 
	push 	0
	call 	MessageBoxA 

	
	push 	offset CSiR_Tag
	mov 	dword ptr [CSiR_StartupInfo],44h ; (wielkosc struktury w bajtach)
	push 	offset CSiR_ProcessInfo ;  _PROCESS_INFORMATION 
	push 	offset CSiR_StartupInfo ; wskaznik do struktury STARTUPINFO
	push 	0
	push 	0
	push 	20h ; flaga utworzenia 
	push 	0
	push 	0
	push 	0
	push 	0
	push 	offset CSiR_AppName ; wskaznik do nazwy pliku
	call 	CreateProcessA	; uruchamia spakowany plik
	test 	eax,eax
	jz 	OpenERR 
Wait4Depack: 
	push 	LARGE-1 ; czas w milisekundach 
	push 	dword ptr [CSiR_ProcessInfo]
	call 	WaitForInputIdle	; czekaj az plik sie odpakuje

Check_Data: 
	push 	0 
	push 	dword ptr [origsize] ; dlugosc bajtow do odczytania
	push 	offset CSiR_RPBuffer ; miejsce do zapisania odczytanych danych
	push 	dword ptr [fuck] ; zrodlo
	push 	dword ptr [CSiR_ProcessInfo] ; proces, z ktorego odczytujemy
	call 	ReadProcessMemory	;odczytaj dane
	test 	eax,eax
	jz 	ReadERR
	
	cld
	lea 	esi, CSiR_RPBuffer	; oryginalne bajty
	lea 	edi, checkbytes	; i bajty ktore powinny sie tam znajdowac
	mov 	ecx, dword ptr [origsize]
	repnz cmpsb
	jnz 	VersionERR	;jesli bajty nie sa takie same to mamy zla wersje pliku
	;...
Patch_the_mother:
	push 	0 ; 
	push 	dword ptr [patch_size_1] ; ilosc bajtow do zapisania
	push 	offset patch_data_1 ; zrodlo
	push	dword ptr [patch_addr_1] ; przeznaczenie
	push 	dword ptr [CSiR_ProcessInfo] ; proces w ktorym zapisujemy bajty
	call 	WriteProcessMemory	;zapisz dane
	test 	eax,eax
	jz 	WriteERR

Close_This_app:
	push 	dword ptr [CSiR_ProcessInfo]
	call 	CloseHandle
	push 	dword ptr [CSiR_ProcessInfo+4]	; zamknij oba uchwyty
	call 	CloseHandle			

Exit_Proc:
	Push 	LARGE-1
	Call 	ExitProcess 	; i zamknij loadera
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

VersionERR:
	lea 	eax, VersionERR_txt
	jmp 	abort
ReadERR:
	lea 	eax, ReadERR_txt
	jmp 	abort
OpenERR:
	lea 	eax, OpenERR_txt		; obsluga okienek z bledami
	jmp 	abort
WriteERR:
	lea 	eax, WriteERR_txt
abort:
	push 	0
	push 	offset CSiR_Error 
	push 	eax 
	push 	0
	call 	MessageBoxA 
	jmp 	Close_This_app


end start
;*************************************************************************

I w ten oto sposob mamy gotowego loadera :D

Jezeli nie rozumiecie jakies funkcji API lub chcecie wiedziec wiecej na jej temat to chyba jak kazdy, odsylam do WinAPIRef. Probowalem tutaj wyjasnic wszystko jak najlatwiej potrafilem...latwiej juz sie chyba nie da!? :)

Jesli masz jakies sugestie, uwagi, propozycje to mail me - mario_crk@poczta.fm

Greetsy umiescilem w .nfo wiec zajrzyj po drodze...
